// 文章模型
package model

import (
	"github.com/jinzhu/gorm"
	"goblog/utils/errmsg"
)

type Article struct {
	Category Category `gorm:"foreignkey:Cid"` //category包含Article 物理外键
	gorm.Model
	Title   string `gorm:"type:varchar(100);not null" json:"title"`
	Cid     int    `gorm:"type:int;not null" json:"cid"`
	Desc    string `gorm:"type:varchar(200)" json:"desc"`
	Content string `gorm:"type:longtext" json:"content"`
	Img     string `gorm:"type:varchar(100)" json:"img"`
}

// 添加文章

func CreateArt(data *Article) int { //返回的int就是状态码
	err := db.Create(&data).Error
	if err != nil {
		return errmsg.ERROR //400
	}
	return errmsg.SUCCESS
}

// 查询分类下的所有文章

func GetCateArt(id, pageSize int, pageNum int) ([]Article, int, int) {
	var artList []Article
	var total int //查看总数
	err := db.Preload("Category").Limit(pageSize).Offset((pageNum-1)*pageSize).Where("cid = ?", id).Find(&artList).Count(&total).Error
	if err != nil {
		return nil, errmsg.ERROR_CATE_NOT_EXIST, 0
	}
	return artList, errmsg.SUCCESS, total
}

// 查询单个文章

func GetArtInfo(id int) (Article, int) {
	var art Article
	err := db.Preload("Category").Where("id = ?", id).First(&art).Error
	if err != nil {
		return art, errmsg.ERROR_ART_NOT_EXIST
	}
	return art, errmsg.SUCCESS
}

//查询文章列表

func GetArt(pageSize int, pageNum int) ([]Article, int, int) {
	var articleList []Article //定义一个users等于上面的切片
	var total int
	err = db.Preload("Category").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&articleList).Count(&total).Error //Preload预加载Limit做分页 Offset偏移量
	if err != nil && err != gorm.ErrRecordNotFound {
		return nil, errmsg.ERROR, 0
	}
	return articleList, errmsg.SUCCESS, total
}

//编辑文章
//map更新会更新其中有变化的属性而struct是更新有变化且非零的值（但是次项目中我们role设置有0）

func EditArt(id int, data *Article) int {
	var art Article                         //var一个user是User的模型保持简洁
	var maps = make(map[string]interface{}) //interface是接口类型
	maps["title"] = data.Title              //给maps赋值
	maps["cid"] = data.Cid
	maps["desc"] = data.Desc
	maps["content"] = data.Content
	maps["img"] = data.Img

	err = db.Model(&art).Where("id = ?", id).Update(maps).Error //从db.Model中的User更新
	if err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCCESS
}

//删除文章

func DeleteArt(id int) int {
	var art Article
	err = db.Where("id = ?", id).Delete(&art).Error
	if err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCCESS
}
